﻿//给定一个 n 个点 m 条边的有向图，点的编号是 1 到 n，图中可能存在重边和自环。
//请输出任意一个该有向图的拓扑序列，如果拓扑序列不存在，则输出 −1。
//若一个由图中所有点构成的序列 A 满足：对于图中的每条边(x, y)，x 在 A 中都出现在 y 之前，则称 A 是该图的一个拓扑序列

//第一行包含两个整数 n 和 m。
//接下来 m 行，每行包含两个整数 x 和 y，表示存在一条从点 x 到点 y 的有向边(x, y)。


//#include <iostream>
//#include <string.h>
//using namespace std;
//
//const int N = 100010;
//int h[N], e[N], ne[N], idx;
//int q[N], d[N], n, m;
//
//void add(int a, int b)      // 树和图的存储
//{
//    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
//}
//
//bool TPsort()
//{
//    int hh = 0, tt = -1;           // 因为还没插入数，所以队列的 tt == -1
//    for (int i = 1; i <= n; i++)
//    {
//        if (d[i] == 0) q[++tt] = i;   // 先把入度为 0 的数入队列
//    }
//
//    while (hh <= tt)
//    {
//        int t = q[hh++];      // 遍历 t 的那一条边
//        for (int i = h[t]; i != -1; i = ne[i])
//        {
//            int j = e[i];
//            d[j]--;
//            if (d[j] == 0) q[++tt] = j;
//        }
//    }
//    return tt == n - 1;
//}
//
//int main(void)
//{
//    memset(h, -1, sizeof h);    // 类似于哈希表
//    cin >> n >> m;
//    for (int i = 0; i < m; i++)
//    {
//        int a, b;
//        cin >> a >> b;
//        add(a, b);          // 有向图，只建一条边
//        d[b]++;             // 记录数 b 增加一个入度 
//    }
//
//    if (TPsort())    ///
//    {
//        for (int i = 0; i < n; i++) cout << q[i] << ' ';  // 队列里面的是 TP 排序好的
//    }
//    else cout << -1 << endl;
//
//
//    return 0;
//}